/**
 * @desc activiti 流程测试服务类
 */
package com.cloudwise.isop.kg.service;

import com.cloudwise.isop.kg.dao.UserDao;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class ProcessService {
    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;
    private String processIntanceId;
    @Autowired
    private UserDao userDao;

    /**
     * @desc 发布流程
     */
    @Transactional
    public void deploy() {
        repositoryService.createDeployment().addClasspathResource("processes/UploadCase.bpmn").addClasspathResource("processes/UploadCase.png").deploy();
        repositoryService.createDeployment().addClasspathResource("processes/MyProcess.bpmn").addClasspathResource("processes/MyProcess.png").deploy();
    }

    /**
     * @desc 这里设置3个用户组  poster,xiaomi,xiaogang 也就是对应的 系统角色+组织id 拼接出来的
     */
    @Transactional
    public void startProcess() {
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("role1", "user1, user2, user3");   // 第一步流程执行角色
        variables.put("role2", "manager1, manager2, manager3");   // 第二步流程执行角色
        variables.put("role3", "boss1, boss2, boss3");   // 第三部流程执行角色
        // 启动流程获取流程实例
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("myProcess", variables);
        processIntanceId = pi.getId();
        System.out.println("流程实例： " + processIntanceId);
        // 获取流程实例id 作为表单数据表的一个字段
        // formDataService.insert(processIntanceId, formData);
    }

    /**
     * @desc 启动流程2
     */
    @Transactional
    public void startProcess2(Long caseId) {
        // 启动流程获取流程实例
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("uploadCase");
        processIntanceId = pi.getId();
        System.out.println("流程实例： " + processIntanceId);

        // TODO 添加关联表数据
    }

    /**
     * @desc 根据组（这里的组相当于  系统角色+ 组织id 拼接出来）获取任务
     */
    @Transactional
    public List<Task> getTasks(String role) {
        return taskService.createTaskQuery().taskCandidateGroup(role).list();
    }

    /**
     * @desc 根据组（这里的组相当于  系统角色+ 组织id 拼接出来）获取任务
     */
    @Transactional
    public List<Task> getTasksByUser(String user) {
        return taskService.createTaskQuery().taskCandidateUser(user).list();
    }

    /**
     * @desc 根据任务通过当前流程阶段，并添加评论， 这里 userId 是当前用户的用户名
     * @param taskId 任务id
     * @param comment 品论内容
     * @param userId 当前登录用户用户名， 在生产环境中不对外暴露，这里只是demo 中使用
     * @return
     */
    @Transactional
    public void compeleteTask(String taskId, String comment, String userId) {
//        List<String> users = userDao.getUsers();
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("allow", true);
        addComment(taskId, comment, userId);
        taskService.complete(taskId, variables);
        // TODO 根据工作流实例ID更新关系表数据状态
        // TODO 添加流水
//        if(taskService.getProcessInstanceAttachments().){
//            // 已发布
//        }else{
//            // 待审核
//        }

    }

    /**
     * @desc 驳回流程， 第二个参数是驳回的路径，此处驳回有两个流程，具体看流程图
     * @param taskId
     * @param type
     * @return
     */
    @Transactional
    public void rejectTask(String taskId, String comment, String userId, Integer type) {
        Map<String, Object> variables = new HashMap<String, Object>();
        variables.put("allow", false);
//        variables.put("type", type);
        addComment(taskId, comment, userId);
        taskService.complete(taskId, variables);

        // TODO 添加流水
        // TODO 根据工作流实例ID更新关系表数据状态
    }

    /**
     * 添加评论
     * @param taskId
     * @param comment
     * @param userId
     */
    private void addComment(String taskId, String comment, String userId){
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        String processId = task.getProcessInstanceId();
        Authentication.setAuthenticatedUserId(userId);
        taskService.addComment(taskId, processId, comment);
    }

    /**
     * 获取流程历史信息
     * @param processInstanceId
     * @return
     */
    public List<Comment> history(String processInstanceId){
        return taskService.getProcessInstanceComments(processInstanceId);
    }

}